package lsl.practice.chapter1.test01;

/**
 * 整数除法
 *
 * @author Zed
 * @description
 * @date 2022/12/15 20:56
 */

/**
 * 输入2个int型整数，它们进行除法计算并返回商
 * 要求不能使用乘号*,除号'/'以及求余符号'%'。
 * 当发生溢出的时候，返回最大的整数值。假设除数不为0
 */
public class Client {
    //1.将负数转为正数存在一个问题。最小的整数是-2^31，最大的整数是2^31-1。
    //2.因此，如果将-2^31转为正整数会导致溢出。
    //3.由于将任意正整数转为负数都不会溢出，因此可以先将正数都转换为负数，然后再根据需要调整商的正负号
    //4.int类型的除法只有一种情况会导致溢出，即-2^31/(-1)，因为最大的正数为 2^31-1，2^31超出了范围
    public static void main(String[] args) {
        System.out.println(divide(15, 2));
    }

    public static int divide(int divided, int divisor) {
        //divided:被除数,divisor:除数
        if (divided == 0x80000000 && divisor == -1) {
            return Integer.MAX_VALUE;
        }
        int negative = 2;
        if (divided > 0) {
            negative--;
            divided = -divided;
        }
        if (divisor > 0) {
            negative--;
            divisor = -divisor;
        }
        int result = dividedCore(divided, divisor);

        //negative == 1说明被除数和除数一正一负
        return negative == 1 ? -result : result;
    }

    private static int dividedCore(int divided, int divisor) {
        int result = 0;
        while (divided <= divisor) {
            int value = divisor;
            int quotient = 1;
            while (value >= 0xc0000000 && divided <= value + value) {
                quotient += quotient;
                value += value;
            }
            result += quotient;
            divided -= value;
        }
        return result;
    }
}
